"""
    基于select的并发服务模型
"""

from select import *
from socket import *

# 服务端地址
HOST="0.0.0.0"
PORT=1234
ADDR=(HOST, PORT)

# 创建监听套接字
sock=socket()
sock.bind(ADDR)
sock.listen(3)
# 配合非阻塞IO
sock.setblocking(False)

ep=epoll()
map={sock.fileno(): sock}
ep.register(sock, EPOLLIN)

# 循环监控关注IO的发生
while True:
    events=ep.poll()
    for fd, event in events:
        if fd == sock.fileno():
            # 处理客户端连接
            connfd, addr=map[fd].accept()
            print("Connect from", addr)
            connfd.setblocking(False)
            ep.register(connfd, EPOLLIN | EPOLLERR)  # 增加关注对象
            map[connfd.fileno()]=connfd
        elif event == EPOLLIN:
            # 处理客户端消息
            data=map[fd].recv(1024)
            # 处理客户端退出
            if not data:
                ep.unregister(fd)  # 不在关注
                map[fd].close()
                del map[fd]
                continue
            print(data.decode())
            map[fd].send(b'Thanks')
